package ext.tianma.bom.workflow;

import java.rmi.RemoteException;
import java.util.ArrayList;

import wt.doc.WTDocument;
import wt.fc.QueryResult;
import wt.fc.WTObject;
import wt.fc.collections.WTArrayList;
import wt.part.WTPart;
import wt.util.WTException;
import ext.com.iba.IBAUtil;
import ext.tianma.version.ComToolUtil;

/**Description:【设计转量产流程】的业务处理逻辑
 * @author    :  YangWen
 * @create at :  2013-8-21   上午10:39:53
 */
public class DesignConvertThroughputBusiness implements BOMWorkFlowInterface {
	

	/**
	 * 展示是否输出log信息
	 */
	private static boolean isShow = true;
	
	/**
     * 成品
     */
    private static final String FINISHEDGOOD = SingletonBOM.getInstance().getFinishedGood();
	/**生命周期状态数组
	 * NewProduct.value=新品
	 */
	private static final String[] LIFESTATEARRAY = { "NewProduct" };
	
    /**目标生命周期状态
     * MassProductionRelease.value=量产发布
     */
    private static final String TARGETLCSTATE = "MassProductionRelease";
	
    
    
	/**
	 * 私有构造函数，防止实例化
	 */
	private DesignConvertThroughputBusiness(){
		
	}
	
	/**输出log信息
	 * @param info
	 */
	private static void out(String info){
		if(isShow)
			System.out.println("【设计转量产流程】的业务处理逻辑:"+DesignConvertThroughputBusiness.class.getName()+":"+info);
	}
	
	
	

    /**YW
     * 【设计转量产提交】活动点击【完成】时需满足的条件
     * 即当前对象所关联的成品中，存在【成品】编号不是【试制件】(即编号是以-T结尾)，且生命周期是【新品】状态的对象时，则给出不能完成的提示信息
     * @param obj WTObject，即pbo对象，亦即主业务对象
     * @throws WTException
     */
    public static void designSubmitCompleteCondition(WTObject obj) throws WTException {
    	
    	if(obj == null || !(obj instanceof WTDocument)){
    		out("传入进来的对象"+obj+"为空或者不是【WTDocument】类型的对象，直接返回空！");
    		return ;
    	}
    	    		
	    WTDocument doc = (WTDocument) obj;
	    //获取当前文档所关联的所有零部件
	    QueryResult refPartQR = ext.com.core.CoreUtil.getAssociatedParts(doc);
	    String  errorPartNumber = "";
	    while (refPartQR.hasMoreElements()) {
			Object refObj = refPartQR.nextElement();
			if (refObj instanceof WTPart) {
			    WTPart part = (WTPart) refObj;
			    
			    //只有pbo所关联的所有部件中每一个对象都是【成品】，
			    //且不是【试制件】，且是【新品】状态，才让其通过，否则报错
			    
			  //如果【当前部件类型】不是【成品】，则记录错误信息：当前编号
				if (!ExamineAndApproveConfirmBusiness.isSubObject(part, FINISHEDGOOD)) {
					errorPartNumber += "\n"+part.getDisplayIdentifier()+"   :   不是【成品】类型!";
					continue;
				}
			    
			    //如果当前部件是【试制件】(即编号是以-T结尾),则记录错误信息：当前编号
			    if (part.getNumber().endsWith("-T")) {
			    	errorPartNumber += "\n"+part.getDisplayIdentifier()+"   :  是【试制件】类型!";
			    	continue;			    	
			    }
			    
			    //如果当前部件的生命周期不是【新品】状态，则记录错误信息：当前编号
			    if(!ExamineAndApproveConfirmBusiness.isInner(part, LIFESTATEARRAY)){
			    	errorPartNumber += "\n"+part.getDisplayIdentifier()+"   :   生命周期不是【新品】状态!";
			    	continue;
			    }
			    
			}
	    }
	    
	    if(!ComToolUtil.isEmpty(errorPartNumber))
	    	throw new WTException("部件【"+doc.getDisplayIdentifier()+"】存在以下不满足要求的对象:"+errorPartNumber);
	    		
    }
    
    

    /**YW
     * 获得obj下所关联的所有部件，且这些部件满足如下要求的部件对象集合，把它们的生命周期状态都设置为【量产发布】，并返回
     * 1、此部件是成品；
     * 2、此成品没有关联【正在运行】的【样品承认及批准流程】进程
     * @param obj
     * @return WTArrayList对象
     * @throws WTException
     */
    public static WTArrayList getAndSetReferenceSpecificPart(WTObject obj) throws WTException {
    	
    	if(obj == null || !(obj instanceof WTDocument)){
    		out("传入进来的对象"+obj+"为空或者不是【WTDocument】类型的对象，直接返回空！");
    		return null;
    	}
    	    		
	    WTDocument doc = (WTDocument) obj;
    			
		ArrayList<WTPart> result = new ArrayList<WTPart>();
		    
	    //获取当前文档所关联的所有零部件
	    QueryResult refPartQR = ext.com.core.CoreUtil.getAssociatedParts(doc);
	    if(refPartQR == null || refPartQR.size() == 0)
	    	out("传入进来的对象【"+doc.getDisplayIdentifier()+"】所关联的部件个数是：0");
	    else
	    	out("传入进来的对象【"+doc.getDisplayIdentifier()+"】所关联的部件个数是："+refPartQR.size());
	    
	    while (refPartQR.hasMoreElements()) {
			Object refObj = refPartQR.nextElement();
			if (refObj instanceof WTPart) {
			    WTPart partObj = (WTPart) refObj;
			    
			    out("当前处理的对象是："+partObj.getDisplayIdentifier());
			    
				ArrayList<WTPart> subParts = ExamineAndApproveConfirmBusiness.getAllSubPart(partObj);
				subParts.add(partObj);
			    out("当前处理的对象【"+partObj.getDisplayIdentifier()+"】所包含的所有子部件(包含其本身)的个数是："+subParts.size());				
				
				for (WTPart onePart : subParts) {
					
					out("子部件集中的一个对象是："+onePart.getDisplayIdentifier());
					
					//1、	获得当前文档的所有关联的部件，包括其子部件，进行遍历；
										
					//2、	如果是【成品】，且编号不是-T结尾，状态为【新品】，则符合要求；
					if (ExamineAndApproveConfirmBusiness.isSubObject(onePart, FINISHEDGOOD)) {
						//如果当前部件是【试制件】(即编号是以-T结尾),则记录错误信息：当前编号
					    if (!onePart.getNumber().endsWith("-T")&&ExamineAndApproveConfirmBusiness.isInner(onePart, LIFESTATEARRAY)) {
					    	//添加【当前部件】对象
							result.add(onePart);
					    	continue;			    	
					    }					    
					}					
					//3、	如果是【原材料】，且partRecognize属性值为否则符合要求；
					//是【原材料】对象；
					else if (ExamineAndApproveConfirmBusiness.isObjectType(onePart, "RawMaterial")) {
						//partRecognize属性值为否；
				    	Object recognizeObj = null;
				    	try {
							recognizeObj = IBAUtil.getIBAValue(onePart, "partRecognize");
						} catch (RemoteException e) {
							e.printStackTrace();
						}
				    			    	
				    	out("partRecognize属性值为:"+recognizeObj);
				    	if(ComToolUtil.isEmpty(recognizeObj)){
				    		out("partRecognize的值为空！");
				    		continue;
				    	}else{
				    		String flag = recognizeObj.toString().trim();
				    		out("partRecognize的类型是Boolean类型.");
				    		if(flag.equalsIgnoreCase("false") || flag.equalsIgnoreCase("否") || flag.equalsIgnoreCase("N")){
				    			//添加【当前部件】对象
								result.add(onePart);
				    			continue;
				    		}
				    	}
			    	}
					//4、	如果不是【成品】、【原材料】，则视为符合要求
					else{
			    		//添加【当前部件】对象
						result.add(onePart);
		    			continue;
			    	}
										
				}				    
			    
			}
	    }
	    
	    WTArrayList erpObjs = new WTArrayList();
	    erpObjs.addAll(result);
	    ExamineAndApproveConfirmBusiness.setLifeCycleState(erpObjs, TARGETLCSTATE);
		
		return erpObjs;
    }
    
    
}
